Remix 写 API 接口

您所在的位置:网站首页 node api接口 Remix 写 API 接口

Remix 写 API 接口

2023-04-09 02:26| 来源: 网络整理| 查看: 265

Remix 是一个全栈框架,能写 api 接口的能肯定是具备的,而且 Remix 虽然定义为全栈框架,此文章主要探索如何接口。

本文内容Remix 中 api 的书写方式Remix 中 RESTful api 的属性方式类 MVC 分层接口如何写 Remix处理上传示例接口种类普通 get/post api:即可满足基本RESTful API:有规范, 需要协同的graphql:可控制需要的字段的,良好的跨端

其中如果是一些小项目,没有必要规则化的项目,使用 get/post 处理就已经足够了,如果项目有了很多的人要维护,并且有了一定的规模,为了方便管理,可以使用 RESTful API 的方式处理。graphql API 手动能力最强。

RESTful API 特点创建:POST /api/resources读取:GET /api/resources/:id更新:PUT /api/resources/:id删除:DELETE /api/resources/:id

其中,:id 表示资源的唯一标识符。

Remix 中如何处理 api 特点loader 处理 get 请求action 处理非 get 请求Loader 函数处理 Get 请求export const loader = () => { return json({ get: 'loader get' }) } action 处理非 GET 方法import { json } from "@remix-run/node"; const handleNotGetRequest = function ({ request }) { const method = requesthod; switch (method) { case "POST": return json({ code: 0, method: "POST", message: "添加成功" }); case "PUT": return json({ ok: true, code: 1, method: "PUT", message: "修改成功" }); case "DELETE": return json({ ok: true, code: 1, method: "PUT", message: "删除成功" }); default: break; } }; // 非 get export const action = ({ request }) => { return handleNotGetRequest({ request }); }; // get export const loader = ({ request }) => { return json({ a: 1, }); }; 添加控制层和服务层

为了代码更加好维护,有结构的代码时必要的,代码分层占据重要位置。

如果使用 mongoose 等会定义模型层,定义操作数据的模型,然后使用控制层来操作模型层。构成一个简单类 MVC 分层结构。当然 Remix 是一个基于 React + Node.js 全栈框架,使用模型层+服务层:

使用 mongoose 定义模型层, category.model.ts

import mongoose from 'mongoose' const CategorySchema = new mongoose.Schema({ name: String, description: String, createdAt: Date, articleIds: [String] }) export default mongoose.models.Category || mongoose.model('Category', CategorySchema)

使用 category.service.ts 定义服务层,提供给 Remix loader 和 action 操作数据使用

// model import Category from '~/models/category.model' export const delCategoryById = async (_id: string) => { return await Category.remove({ _id }) } export const findCategoryByName = async (name: string) => { return await Category.findOne({ name }) } export const updateCategoryById = async (_id: string, update: any) => { return await Category.findByIdAndUpdate({ _id }, update) } export const findCategoryById = async (_id: string) => { return await Category.findOne({ _id }) } export const addCategoryByName = async (name: string) => { const CategoryEntify = new Category({ name, createdAt: new Date() }) return await CategoryEntify.save() } 暴露 loader 接口// core import { json } from '@remix-run/node' // service import * as categoryService from '~/services/category.service' // remix loader export async function loader() { const list = await categoryService .getCategoryList({}, '_id createdAt name articleIds', 0, 100000) .then((list) => list) return json({ code: 0, message: 'success', data: { list } }, 200) }

在 loader 函数中通过 services 层来获取数据,然后使用 json 函数返回数据。

使用 action 方法处理文件上传接口api.upload.files.tsx 上传文件到本地import type { ActionArgs } from '@remix-run/node' import { json, unstable_composeUploadHandlers as composeUploadHandlers, unstable_createFileUploadHandler as createFileUploadHandler, unstable_createMemoryUploadHandler as createMemoryUploadHandler, unstable_parseMultipartFormData as parseMultipartFormData } from '@remix-run/node' // single file upload export const action = async ({ request }: ActionArgs) => { const uploadHandler = composeUploadHandlers( createFileUploadHandler({ directory: 'public/uploads', // 指定上传目录 maxPartSize: 30000000, // 指定大小 file: (file) => { return file.filename } }), createMemoryUploadHandler() ) const formData = await parseMultipartFormData(request, uploadHandler) return json({ imgSrc: formData.get('file') }) // 返回文件名 }

上传使用 post 方法,在 action 函数使用表单方式进行处理。

小结

本文主要关注点是与 Node.js 其他的框架有什么不同。loader 处理 get 方法,action 处理非 get 请求。从普通的请求处理到处理分层的过程,写好一个 api 的学习变化过程。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3